/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tesauro;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;

/**
 * Carga un diccionario desde un archivo de texto que tenga el siguiente formato:
 *
 * palabra : sinonimo-1, sinonimo-2, sinonimo-n
 * 
 * @author demian
 */
public class CargadorMasivoArchivoTexto implements ICargaMasivaDiccionario {
    private LineNumberReader lr;
    private File archivo;
    public static String CABECERA = "[sinonimos]";
    
    public CargadorMasivoArchivoTexto(File archivo) {
         this.archivo = archivo;
    }
    
    public void cargarDiccionario(DiccionarioSinonimos diccionario) throws Exception {
        int palabras = 0;
        
        try {
             lr = new LineNumberReader(new FileReader(archivo));
             
            String line = proximaLineaValida();
             if(line == null || !line.equals(CABECERA)) {
                 throw new Exception("Archivo de sinonimos no valido.");
             }
             
            StringBuffer palabra = new StringBuffer();
            ArrayList<String> sinonimos =null;
            
            while((line = proximaLineaValida()) != null) {
                palabra.delete(0, palabra.length());

                if(line.length() == 0) {
                    continue;
                }
                
                String []splitted = line.split(":"); 
                
                if(splitted.length > 2) {
                    throw new Exception("Error en la linea " + lr.getLineNumber() +": No puede haber mas de uno caracter especial ':'.");
                }
                
                palabra.append(splitted[0].trim());
                
                if(splitted.length == 1) {
                    diccionario.add(palabra.toString(), new ArrayList<String>(0));
                } else {
                    String []sinonimosArray = splitted[1].split(",");
                    sinonimos = new ArrayList<String>(sinonimosArray.length);
                    for(int i = 0; i < sinonimosArray.length; i++) {
                        sinonimos.add(sinonimosArray[i].trim());
                    }                 
                    diccionario.recursiveAdd(palabra.toString(), sinonimos);
                }
                palabras++;
            }
            
            if(palabras == 0) {
                throw new Exception("Archivo de sinonimos no tiene sinonimos cargados.");
            }
        } catch(FileNotFoundException ex) {
            throw ex;
        } catch (IOException ex) {
            throw new Exception("Exception no esperada en la linea " + lr.getLineNumber() + ". " + ex.toString());
        } finally {
            try {
                if(lr != null) lr.close();
            } catch (IOException ex) {
                throw new Exception("Exception no esperada al cerrar el archivo. " + ex.toString());
            }
        }
    }
    
    private String  proximaLineaValida() throws IOException {
            String line = null;
            String tmpLine = null;
            while((line = lr.readLine()) != null) {
                tmpLine = line.trim();
                if(!tmpLine.isEmpty() && !tmpLine.startsWith("//")) {
                    break;
                }
            }
            
            return line == null ? null : line.trim();
    }
}